知识点名称:Activity的生命周期
编号: K3-4
前驱知识点编号:K3-3
作者:
讲义内容:
Activity从一种状态转变到另一种状态时会触发一些事件,执行一些回调方法来通知状态的变化,这些方法也被称为它的七大生命周期函数。具体方法如下所示:
• void onCreate(Bundle savedInstanceState):创建时执行
• void onStart():可见时执行
• void onRestart():回到前台,再次可见时执行
• void onResume():获取焦点时执行
• void onPause():失去焦点时执行
• void onStop():用户不可见进入后台时执行
• void onDestroy():销毁时执行
下图说明了 Activity 在不同状态间转换的时机和条件,以及不同状态下执行的回调函数。
下面我们结合Activity的生命周期图以及Activity的基本状态,来分析每个方法的调用时机:
(1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
(2)当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
(3)当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
(4)当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
(5)用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
(6)当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
(7)用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。
下面我们就结合实例,来演示一下生命周期的几个过程的详细情况。我们新建一个名为lifecycle的项目,创建一个名为LifeCycleActivity和TargetActivity的Activity,其中LifeCycleActivity作为主界面,主界面上有一个按钮,点击按钮可以跳转到TargetActivity界面,并对这两个Activity进行如下的注册。
<activity
android:name=".LifeCycleActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<catego
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TargetActivity"></activity>
下面我们先来看LifeCycleActivity中的代码:
Activity创建时被调用的onCreate方法代码如下:
public class LifeCycleActivity extends Activity {
private static final String TAG = "LifeCycleActivity";
private Context context = this;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate called.");
setContentView(R.layout.lifecycle);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(context, TargetActivity.class);
startActivity(intent);
}
});
}
}
Activity创建或者从后台重新回到前台时被调用的onStart方法代码重写如下:
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart called.");
}
Activity从后台重新回到前台时被调用的onRestart方法代码重写如下:
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart called.");
}
Activity创建或者从被覆盖、后台重新回到前台时被调用的onResume方法代码重写如下:
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume called.");
}
Activity被覆盖到下面或者锁屏时被调用的onPause方法代码重写如下:
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause called.");
//有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据
}
退出当前Activity或者跳转到新Activity时被调用的onStop方法代码重写如下:
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop called.");
}
退出当前Activity时被调用,调用之后Activity就结束了的onDestroy方法代码重写如下:
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestory called.");
}
下面我们就来操作一下这个Activity,看看它的生命周期到底是个什么样的过程:
(1)启动Activity:
在系统调用了onCreate和onStart之后,调用了onResume,自此,Activity进入了运行状态,运行结果截图如下:
(2)跳转到其他Activity,或按下Home键回到主屏:
我们看到,主界面退居后台时,onPause后onStop相继被调用,运行结果截图如下:
(3)从后台回到前台:
当从后台会到前台时,系统先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,Activity又进入了运行状态,运行结果截图如下:
(4)退出
最后onDestory方法被调用,标志着LifeCycleActivity的终结,运行结果截图如下:
以上实例我们演示了Activity生命周期的过程,以及该过程中代表它生命周期的七个函数的回调机制。
<!--
/* Font Definitions */
@font-face
{font-family:Helvetica;
panose-1:2 11 5 4 2 2 2 2 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:-536870145 1107305727 0 0 415 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman","serif";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-size:10.0pt;
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;
mso-ascii-font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-hansi-font-family:"Times New Roman";
mso-font-kerning:0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
下面我们再来看各Activity之间是如何协调的,当一个Activity启动另一个Activity时,它们都会体验到生命周期转变。第一个Activity暂停并停止(但如果它在后台仍然可见,则不会停止)时,同时系统会创建另一个Activity。如果这些Activity共用保存到磁盘或其他地方的数据,必须了解的是,在创建第二个Activity前,第一个Activity不会完全停止。更确切地说,启动第二个Activity的过程与停止第一个Activity的过程存在重叠。
生命周期回调的顺序经过明确定义后,当两个Activity位于同一进程,并且由一个Activity启动另一个Activity时,其定义尤其明确。以下是当Activity A启动Activity B时一系列操作的发生顺序:
1.Activity A的onPause()方法执行。
2.Activity B的onCreate()、onStart()和onResume()方法依次执行。(Activity B现在具有用户焦点。)
3.然后,如果Activity A在屏幕上不再可见,则其onStop()方法执行。
请你利用这种可预测的生命周期回调顺序管理从一个Activity到另一个Activity的信息转变。例如,如果你必须在第一个Activity停止时向数据库写入数据,以便下一个Activity能够读取该数据,则应在onPause()而不是onStop()执行期间向数据库写入数据。
lo.,�̛